package chai.ning.cs.chars;
/**
 * 1、继承 Object 类并实现 java.lang.CharSequence 接口
 * 2、解决字符序列的存储问题:  使用数组可以依次序存储多个字符 ，所以在 Characters 类中声明了 char[] 数组类型的实例变量
 * 3、重写 toString方法( 实际上也是 CharSequence接口中需要实现的方法)
 * 4、通过构造方法解决字符序列的传入问题: 将用户在字符数组中存储的内容拷贝到Characters实例的实例变量中
 * 5、实现 charAt 方法 和 length 方法
 * 6、实现 subSequence
 */
public class Characters extends Object implements CharSequence {
	private char[] chars;

	public Characters(char[] chars) {
		this.chars = new char[ chars.length ] ;
		System.arraycopy(chars, 0, this.chars, 0, chars.length);
	}

	@Override
	public int length() {
		return chars.length;
	}

	@Override
	public char charAt(int index) {
		if (index >= 0 && index < chars.length ) {
			return chars[ index ] ;
		}
		return 0;
	}

	@Override
	public CharSequence subSequence(int start, int end) {
		// 检查start和end是否是有效数值
		if(start >= 0 && end > start && end <= chars.length) {
			// 求截取的 子序列 的长度 ( 即字符数 
			int n = end - start ;
			// 从当前对象的 chars 数组中取 [ start , end ) 之间的元素组成一个新数组
			char[] arr = new char[ n ];					
			System.arraycopy(this.chars, start, arr, 0, n);
			// 根据新的数组创建一个新的Characters对象
			Characters c = new Characters( arr);
			// 返回创建的Characters对象
			return c ;			// 方法的返回类型是 CharSequence，而 Characters是CharSequence的实现类
		}
		return null;
	}

	@Override
	public String toString() {
		String s = " " ;
		for( int i = 0; i < chars.length ; i++ ) {
			s += chars[i];
		}
		return s ;
	}

}
